
    <!DOCTYPE html>
    <html lang="zh-CN">
    <head>
      <meta charset="UTF-8">
      <meta name="viewport" content="width=device-width, initial-scale=1.0">
      <title>5、MongoDB实战案例 - 学习卡片</title>
      <style>
        body { font-family: sans-serif; background-color: #f0f8ff; color: #333; display: flex; flex-direction: column; align-items: center; padding: 50px 20px; }
        .header h1 { font-size: 32px; }
        .grid-container { display: grid; grid-template-columns: repeat(3, 1fr); gap: 28px; width: 100%; max-width: 1200px; }
        .card-container { perspective: 1200px; cursor: pointer; height: 250px; }
        .card { width: 100%; height: 100%; position: relative; transform-style: preserve-3d; transition: transform 0.7s; border-radius: 16px; box-shadow: 0 4px 16px rgba(0,0,0,0.08); }
        .card-container.flipped .card { transform: rotateY(180deg); }
        .card-face { position: absolute; width: 100%; height: 100%; backface-visibility: hidden; display: flex; flex-direction: column; box-sizing: border-box; border-radius: 16px; background-color: #fff; padding: 24px; }
        .card-back { background-color: #f0fff4; transform: rotateY(180deg); justify-content: space-between; }
        .card-category { font-size: 14px; color: #0052d9; margin-bottom: 8px; font-weight: 500; }
        .card-question { font-size: 20px; font-weight: 500; flex-grow: 1; display: flex; align-items: center; justify-content: center; text-align: center; }
        .card-answer-wrapper { flex-grow: 1; overflow-y: auto; }
        .card-answer { font-size: 15px; line-height: 1.7; }
        .card-footer { font-size: 13px; color: #8a919f; border-top: 1px solid #f0f0f0; padding-top: 16px; margin-top: 16px; }
        .card-source { font-size: 13px; color: #8a919f; border-top: 1px solid #f0f0f0; padding-top: 12px; margin-top: 12px; }
      </style>
    </head>
    <body>
      <div class="header">
        <h1>5、MongoDB实战案例 - 学习卡片</h1>
      </div>
      <div class="grid-container">
        
    <div class="card-container" onclick="this.classList.toggle('flipped');">
      <div class="card">
        <div class="card-face card-front">
          <div class="card-category">理论</div>
          <div class="card-question">内容管理系统（CMS）在进行数据模型设计时，通常需要考虑哪些核心的数据特点？</div>
          <div class="card-footer">点击卡片查看答案</div>
        </div>
        <div class="card-face card-back">
          <div class="card-category">理论</div>
          <div class="card-answer-wrapper">
            <div class="card-answer">CMS系统的数据模型设计需要考虑四个核心特点：内容结构灵活、有版本控制需求、分类体系复杂、以及权限管理严格。</div>
          </div>
          <div class="card-source">来源: 1.1 CMS系统数据特点</div>
        </div>
      </div>
    </div>

    <div class="card-container" onclick="this.classList.toggle('flipped');">
      <div class="card">
        <div class="card-face card-front">
          <div class="card-category">模式</div>
          <div class="card-question">在CMS的分类模型中，为了支持无限层级的分类体系，设计中包含了哪些关键字段来实现这一功能？</div>
          <div class="card-footer">点击卡片查看答案</div>
        </div>
        <div class="card-face card-back">
          <div class="card-category">模式</div>
          <div class="card-answer-wrapper">
            <div class="card-answer">为了支持层级分类，分类文档中设计了三个关键字段：`parent_id` 用于指向父分类，`level` 表示当前分类的层级深度，以及 `path` 数组用于存储从根分类到当前分类的路径名称。</div>
          </div>
          <div class="card-source">来源: 1.2 文档与分类模型</div>
        </div>
      </div>
    </div>

    <div class="card-container" onclick="this.classList.toggle('flipped');">
      <div class="card">
        <div class="card-face card-front">
          <div class="card-category">机制</div>
          <div class="card-question">文档中是如何实现CMS内容版本控制的？版本历史文档记录了哪些核心信息？</div>
          <div class="card-footer">点击卡片查看答案</div>
        </div>
        <div class="card-face card-back">
          <div class="card-category">机制</div>
          <div class="card-answer-wrapper">
            <div class="card-answer">通过创建一个独立的“版本历史文档”来实现。该文档记录了关联主内容的 `content_id`、版本号 `version`、具体变更内容的 `changes` 对象、变更作者 `author`、创建时间 `created_at` 以及变更备注 `comment`。</div>
          </div>
          <div class="card-source">来源: 1.4 内容版本控制</div>
        </div>
      </div>
    </div>

    <div class="card-container" onclick="this.classList.toggle('flipped');">
      <div class="card">
        <div class="card-face card-front">
          <div class="card-category">模式</div>
          <div class="card-question">在电商产品数据模型中，`inventory` 字段是如何设计的以同时追踪总库存、可用库存和预留库存？</div>
          <div class="card-footer">点击卡片查看答案</div>
        </div>
        <div class="card-face card-back">
          <div class="card-category">模式</div>
          <div class="card-answer-wrapper">
            <div class="card-answer">`inventory` 字段被设计为一个内嵌对象，其中包含三个子字段：`total` 代表总库存量，`available` 代表当前可供销售的库存，以及 `reserved` 代表已被下单但尚未发货的预留库存。</div>
          </div>
          <div class="card-source">来源: 2.1 商品目录数据模型</div>
        </div>
      </div>
    </div>

    <div class="card-container" onclick="this.classList.toggle('flipped');">
      <div class="card">
        <div class="card-face card-front">
          <div class="card-category">技术</div>
          <div class="card-question">在高并发电商场景下，为防止超卖，文档中展示的库存更新操作是如何利用原子操作实现的？</div>
          <div class="card-footer">点击卡片查看答案</div>
        </div>
        <div class="card-face card-back">
          <div class="card-category">技术</div>
          <div class="card-answer-wrapper">
            <div class="card-answer">库存更新使用了 `updateOne` 方法，其查询条件中包含了对 `inventory.available` 数量的检查（`$gte: 1`），确保库存充足。更新操作则利用 `$inc` 原子操作符，将 `inventory.available` 减1，同时将 `inventory.reserved` 加1，保证了操作的原子性。</div>
          </div>
          <div class="card-source">来源: 2.3 高并发场景优化</div>
        </div>
      </div>
    </div>

    <div class="card-container" onclick="this.classList.toggle('flipped');">
      <div class="card">
        <div class="card-face card-front">
          <div class="card-category">模式</div>
          <div class="card-question">根据文档，一个典型的电商订单文档（Order Document）由哪些主要部分组成？</div>
          <div class="card-footer">点击卡片查看答案</div>
        </div>
        <div class="card-face card-back">
          <div class="card-category">模式</div>
          <div class="card-answer-wrapper">
            <div class="card-answer">一个订单文档主要由以下部分组成：订单号 `order_number`、用户ID `user_id`、商品列表 `items`、总金额 `total_amount`、订单状态 `status`、支付信息内嵌文档 `payment`、以及配送信息内嵌文档 `shipping`。</div>
          </div>
          <div class="card-source">来源: 2.2 订单系统数据模型</div>
        </div>
      </div>
    </div>

    <div class="card-container" onclick="this.classList.toggle('flipped');">
      <div class="card">
        <div class="card-face card-front">
          <div class="card-category">技术</div>
          <div class="card-question">为了提高日志系统的写入效率并有效管理存储空间，文档提出了哪两种高效策略？</div>
          <div class="card-footer">点击卡片查看答案</div>
        </div>
        <div class="card-face card-back">
          <div class="card-category">技术</div>
          <div class="card-answer-wrapper">
            <div class="card-answer">文档提出了两种策略：1. 使用 `insertMany` 进行批量插入，以减少网络开销和数据库写入次数。2. 创建TTL（Time-To-Live）索引，在 `timestamp` 字段上设置 `expireAfterSeconds`，使数据库能自动清理指定时间（如30天）前的过期日志。</div>
          </div>
          <div class="card-source">来源: 3.2 高效写入策略</div>
        </div>
      </div>
    </div>

    <div class="card-container" onclick="this.classList.toggle('flipped');">
      <div class="card">
        <div class="card-face card-front">
          <div class="card-category">模式</div>
          <div class="card-question">在日志分析场景中，时序数据文档（Time Series Data Document）是如何建模的？包含了哪些基本字段？</div>
          <div class="card-footer">点击卡片查看答案</div>
        </div>
        <div class="card-face card-back">
          <div class="card-category">模式</div>
          <div class="card-answer-wrapper">
            <div class="card-answer">时序数据文档包含四个基本字段：`metric` (指标名称，如 'cpu_usage')、`timestamp` (数据点的时间戳)、`value` (指标的具体数值) 以及 `tags` (一个包含键值对的对象，用于描述和过滤数据，如主机和区域)。</div>
          </div>
          <div class="card-source">来源: 3.1 日志数据模型</div>
        </div>
      </div>
    </div>

    <div class="card-container" onclick="this.classList.toggle('flipped');">
      <div class="card">
        <div class="card-face card-front">
          <div class="card-category">模式</div>
          <div class="card-question">在社交网络的用户关系模型中，用户的关注者（followers）和正在关注（following）的关系是如何在同一个用户文档中进行存储的？</div>
          <div class="card-footer">点击卡片查看答案</div>
        </div>
        <div class="card-face card-back">
          <div class="card-category">模式</div>
          <div class="card-answer-wrapper">
            <div class="card-answer">用户的关注者和正在关注的关系是通过在用户文档中内嵌两个数组字段来实现的：`followers` 数组和 `following` 数组。这两个数组都包含了一系列对象，每个对象记录了关联用户的 `user_id` 和关注发生的时间 `followed_at`。</div>
          </div>
          <div class="card-source">来源: 4.1 用户关系模型</div>
        </div>
      </div>
    </div>

      </div>
    </body>
    </html>
